package net.jcip.chapter4;

import java.util.*;

import net.jcip.annotations.*;

/**
 * Using confinement to ensure thread safety  通过封闭机制保证线程安全
 *
 * 这个示例并未对Person的线程安全性做任何假设，但如果Person类是可变的，那么在访
 * 问从PersonSet中获得的Person对象时，还需要额外的同步。要想安全地使用Person对象，最
 * 可靠的方法就是使Person成为一个线程安全的类。另外，也可以使用锁来保护Person对象，
 * 并确保所有客户代码在访问Person对象之前都已经获得正确的锁。
 *
 *
 * @author Brian Goetz and Tim Peierls
 */

@ThreadSafe
public class PersonSet {
    @GuardedBy("this")
    private final Set<Person> mySet = new HashSet<Person>();

    public synchronized void addPerson(Person p) {
        mySet.add(p);
    }

    public synchronized boolean containsPerson(Person p) {
        return mySet.contains(p);
    }



    /**
     * 线程 不安全的 person 类
     *
     * */
    private class Person {

        private String  name ;
        private Integer age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }



}
